\section*{Es. Makefile}
Si vuole creare un \texttt{Makefile} per il programma contenuto dell'archivio \texttt{makefile.zip}, in modo tale che digitando \texttt{make} sulla linea di comando il programma contenuto possa essere compilato correttamente.\\
Si seguano i seguenti passi
\begin{enumerate}
    \item Scrivere il \texttt{Makefile} nel formato pi\`u semplice, utilizzando quindi chiamate del tipo:
    \begin{verbatim}
        edit : main.o kbd.o command.o display.o
            g++ -o edit main.o kbd.o command.o display.o

        main.o : main.cpp defs.hpp
            g++ -c main.cpp

        kbd.o : kbd.cpp defs.hpp command.hpp
            g++ -c kbd.cpp

        clean :
            rm edit main.o kbd.o command.o
    \end{verbatim}
    utilizzando per la compilazione di ciascun file l'opzione \texttt{-Wall}. Fare attenzione che i files sono contenuti nella sotto cartella \texttt{src}, alle dipendenze dei files e alle eventuali chiamate ``a vuoto'' di \texttt{clean}.
    \item Modificare il \texttt{Makefile} precedente introducendo le seguenti variabili
        \begin{itemize}
            \item \texttt{CXX} per indicare il compilatore utilizzato;
            \item \texttt{OPTFLAGS} per indicare le opzioni di ottimizzazione;
            \item \texttt{CXXFLAGS} per indicare le opzioni non di ottimizzazione;
            \item \texttt{EXEC} il nome dell'eseguibile;
        \end{itemize}
        Per usare una variabile digitare \texttt{\$(NOMEVARIBILE)}. Utilizzare inoltre \texttt{.PHONY} per indicare quali tag non sono associati a files. Abilitare l'opzione di ottimizzazione \texttt{-O2} per tutti i files. La variabile \texttt{CXXFLAG} conterr\`a anche quanto definito nella variabile \texttt{OPTFLAG}, ma senza ripeterlo.
        \item Vogliamo gestire in maniera semplificata i files. Consideriamo le seguenti flag del compilatore
            \begin{itemize}
                \item \texttt{-MM} stampa una regola utile per il \texttt{Makefile} che descrive le dipendenze del file. Per un esempio provare a digitare:
                \begin{verbatim}
                    g++ -MM main_integration.cpp
                \end{verbatim}
                \item \texttt{-MF} associata alla flag \texttt{-MM} scrive l'output su il file indicato. Per un esempio provare a digitare:
                \begin{verbatim}
                    g++ -MM main_integration.cpp -MF make.dep
                \end{verbatim}
            \end{itemize}
            Introdurre le seguenti variabili
            \begin{itemize}
                \item \texttt{EXESRCS} il file sorgente contenente il main;
                \item \texttt{EXEOBJS} il file oggetto associato al main, generato automaticamente dalla variabile \texttt{EXESRCS}. Un modo per farlo \`e tramite il seguente comando
                    \begin{verbatim}
                        EXEOBJS = $(EXESRCS:.cpp = .o)
                    \end{verbatim}
                \item \texttt{FOLDER} per indicare la cartella dove sono contenuti i files sorgenti;
                \item \texttt{SRCS} in cui \`e presente la lista di tutti i files sorgenti presenti nella cartella \texttt{FOLDER}. Lista generata automaticamente;
                \item \texttt{OBJS} in cui \`e presente la lista dei files oggetto, generata automaticamente partendo dalla variabile \texttt{SRCS};
                \item \texttt{HEADERS} in cui \`e presente la lista dei files \texttt{.hpp}, generata automaticamente partendo dalla variabile \texttt{SRCS};
                \item \texttt{DEPEND} il nome del file su cui vengono scritti gli output associati ad \texttt{-MM};
            \end{itemize}
            Seguire i seguenti passi
            \begin{enumerate}
                \item quando viene chiamato il tag \texttt{all} inserire come prima dipendenza la generazione del file delle dipendenze;
                \item inserire il tag per generare il file delle dipendenze, associato sia ai files in \texttt{SRCS} sia a quello in \texttt{EXESRCS};
                \item inserire come secondo tag di \texttt{all} la lista dei file oggetto, in questo modo vengono automaticamente creati i corrispondenti files oggetto con le flags indicate in \texttt{CXXFLAGS};
                \item attraverso la keyword \texttt{include} inserire il file con le dipendenze, facendo attenzione al caso in cui esso non \`e presente;
                \item inserire come terzo tag di \texttt{all} il file oggetto contenente il main.
            \end{enumerate}

        \item Introdurre la gestione delle librerie. Vogliamo quindi inserire tutti i files oggetto associati ai files sorgenti in \texttt{SRCS} all'interno di una libreria. I passi sono i seguenti
        \begin{enumerate}
            \item introdurre la seguente variabile locale \texttt{LIBNAME} in cui viene memorizzato il nome della libreria. Si ricorda che una libreria statica in Linux ha la seguente sintassi
                \begin{verbatim}
                    libnumint.a
                \end{verbatim}
                ovvero \`e la libreria \texttt{numint} statica;
            \item introdurre la variabile locale \texttt{LDLIBS} che contiene la lista delle librerie esterne;
            \item introdurre un nuovo tag uguale al nome della libreria in cui viene creata la libreria, tale tag dipende dai files oggetto. Si ricorda che la sintassi \`e la seguente
                \begin{verbatim}
                    ar rv libPROVA.a pippo.o pluto.o
                \end{verbatim}
            \item cambiare il secondo tag di \texttt{all} in modo tale che generi la libreria;
            \item aggiungere la libreria generata alla variabile \texttt{LDLIBS};
            \item specificare nella compilazione del main la dipendenza dalle variabili esterne.
        \end{enumerate}
\end{enumerate}



